Для реализации поиска по LIKE
в поле name
с использованием Prisma, нужно использовать оператор contains
или startsWith
/endsWith
в запросе. Эти операторы позволяют выполнять частичное совпадение строк, аналогично SQL LIKE
.
Обновленный метод в сервисе
Вот как можно обновить метод getAllDocumentsByNameTypeId
для поиска по LIKE
в поле name
и фильтрации по typeId
:
typescript
1 2 3 4 5 6 7 8 9 10 11 | async getAllDocumentsByNameTypeId(name: string, typeId: number) { return this.prisma.documents.findMany({ where: { typeId: Number(typeId), // Преобразуем строку в число name: { contains: name, // Поиск по частичному совпадению (аналог SQL LIKE '%name%') mode: 'insensitive', // Не учитывать регистр (опционально) }, }, }); } |
Объяснение кода
findMany
:- Используется для получения нескольких записей из базы данных, соответствующих условиям.
where
:- Условие фильтрации:
typeId: Number(typeId)
: Фильтрует записи поtypeId
.name: { contains: name }
: Выполняет поиск по частичному совпадению строки в полеname
. Это аналог SQLLIKE '%name%'
.mode: 'insensitive'
: Делает поиск нечувствительным к регистру (например,Document
иdocument
будут считаться совпадением).
- Условие фильтрации:
- Возвращаемое значение:
- Метод возвращает массив документов, соответствующих условиям.
Пример использования
Если вы вызываете этот метод из контроллера, он может выглядеть так:
typescript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import { Controller, Get, Query, NotFoundException } from '@nestjs/common'; import { ApiOperation, ApiResponse, ApiQuery } from '@nestjs/swagger'; import { DocumentsService } from './documents.service'; @Controller('documents') export class DocumentsController { constructor(private readonly documentsService: DocumentsService) {} @ApiOperation({ summary: 'Получить список документов по названию и типу' }) @ApiResponse({ status: 200, description: 'Документы успешно найдены.' }) @ApiResponse({ status: 404, description: 'Документы не найдены.' }) @ApiQuery({ name: 'name', required: false, description: 'Название документа' }) @ApiQuery({ name: 'type_id', required: true, description: 'Тип документа' }) @Get() async findDocuments( @Query('name') name: string, @Query('type_id') typeId: number, ) { const documents = await this.documentsService.getAllDocumentsByNameTypeId( name, typeId, ); if (!documents || documents.length === 0) { throw new NotFoundException('Документы не найдены.'); } return documents; } } |
Пример запросов
- Поиск по названию документа (частичное совпадение):javascript
GET /documents?name=Doc&type_id=1
- Найдет все документы, у которых
name
содержитDoc
(например,Document 1
,MyDoc
).
- Найдет все документы, у которых
- Поиск только по типу документа:javascript
GET /documents?type_id=1
- Найдет все документы с
type_id = 1
.
- Найдет все документы с
- Поиск по названию и типу:javascript
GET /documents?name=Doc&type_id=2
- Найдет документы, у которых
name
содержитDoc
иtype_id = 2
.
- Найдет документы, у которых
Особенности Prisma
contains
: Аналог SQLLIKE '%value%'
.startsWith
: Аналог SQLLIKE 'value%'
.endsWith
: Аналог SQLLIKE '%value'
.mode: 'insensitive'
: Делает поиск нечувствительным к регистру.